var http = require('http'),
	url = require('url'),
	fs = require('fs'),
	util = require('util'),
	filePage = require('./util/filePage'),
	conf = require('./util/config').getConf('../../node-chat.conf');

/* **************************************** */
/* コンフィグデータ取得 開始 */
/* **************************************** */

var hostName = conf['HOST_NAME'],
	portHttp = parseInt(conf['PORT_HTTP']),
	portIo = parseInt(conf['PORT_IO']);

/* **************************************** */
/* コンフィグデータ取得 終了 */
/* **************************************** */


/* **************************************** */
/* HTMLページ準備 開始
/* **************************************** */

/** 存在しないページのときに表示する */
var pageError404 = function(response){
	response.writeHead(
		200,
		{'Content-Type': 'text/html; charset=UTF-8'}
	);
	response.end('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n<html lang="ja"><html><meta http-equiv="content-type" content="text/html; charset=UTF-8"><head><title>存在しないページ</title></head><body>存在しないページです<br /><a href="/">トップページへどうぞ</a></body></html>');
};

/** HTMLファイルを読込んで表示する */
var pageHtmlFile = filePage.makeFilePage('text/html; charset=UTF-8', true, false, pageError404);

/** HTMLテンプレートを読込んで表示する */
var pageTemplateHtmlFile = filePage.makeFilePage('text/html; charset=UTF-8', true, true, pageError404);

/** TOPページを表示する */
var pageTop = function(response){
	pageHtmlFile(
		response,
		'../client/html/top.html'
	);
};

/** チャットページを表示する */
var pageChat = function(response){
	pageTemplateHtmlFile(
		response,
		'../client/template/chat.html',
		{
			hostName: hostName,
			portIo: portIo
		}
	);
};

/** 色々な正規表現にマッチするかを調べる関数を生成する */
var makePathCheck = function(path){
	/** 正規表現にマッチするかを調べる */
	var pathCheck = function(reg){
		var check = path.match(reg);
		return check && check[0];
	};
	return pathCheck;
};

/* **************************************** */
/* HTMLページ準備 終了
/* **************************************** */


/* **************************************** */
/* HTMLページ表示サーバ定義・起動 開始
/* **************************************** */

/* デフォルト8000ポートで普通にHTML等を表示するサーバ */
var server = http.createServer(function(request, response){
	var path = url.parse(request.url).pathname;
	var check = makePathCheck(path);
	switch(path){
	case '/chat.html':  /* チャットページ */
		pageChat(response);
		break;
	case '/': /* トップページ */
		pageTop(response);
		break;
	case check(/^\/[^\/]*\.html$/):
		pageHtmlFile(
			response,
			'../client/html'+path
		);
		break;
	default: /* 存在しないページ */
		pageError404(response);
	}
});
server.listen(portHttp);

/* **************************************** */
/* HTMLページ表示サーバ定義・起動 終了
/* **************************************** */


/* **************************************** */
/* socketサーバ定義・起動 開始
/* **************************************** */

/* デフォルト3000ポートでsocket.ioを使ってリアルタイム通信するサーバ */
var io = require('socket.io').listen(portIo);
io.sockets.on('connection', function(socket){
	/* 接続したときの処理 */
	/* クライアントへメッセージ（キーワード 'message'）を送る */
	io.sockets.emit('message', '接続しました');
	
	/* クライアントからメッセージ（キーワード 'send'）を受取った時の処理*/
	socket.on('send', function(data){
		/* クライアントへメッセージ（キーワード 'message'）を送る */
		io.sockets.emit('message', data);
	});
	
	/* ページ遷移などで接続解除したときの処理 */
	socket.on('disconnect', function(){
		/* クライアントへメッセージ（キーワード 'message'）を送る */
		io.sockets.emit('message', '接続解除しました');
	});
});

/* **************************************** */
/* socketサーバ定義・起動 終了
/* **************************************** */


/* **************************************** */
/* サーバ起動情報表示 開始
/* **************************************** */

util.puts('http server start ' + portHttp);
util.puts('io server start ' + portIo);

/* **************************************** */
/* サーバ起動情報表示 終了
/* **************************************** */